package main

import (
	"gin-demo/internal/config"
	"gin-demo/internal/handlers"

	// 若确实使用到这两个包，保留导入；若未使用，可删除
	"fmt" // 补充缺失的 fmt 包
	"gin-demo/internal/middlewares"
	"gin-demo/internal/routers"
	"gin-demo/pkg/db"
	"net/http"

	"gin-demo/pkg/logger"

	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
)

func main() {
	// 设置 GIN 模式为发布模式
	gin.SetMode(gin.ReleaseMode)

	loggerUtil := logger.NewLoggerUtil()
	defer loggerUtil.Sync()
	r := gin.New()

	// 加载配置
	cfg, err := config.LoadConfig()
	if err != nil {
		loggerUtil.Error("Failed to load config", zap.Error(err))
		panic("failed to load config")
	}

	// 初始化数据库
	dbConn, err := db.ConnectDB()
	if err != nil {
		// 打印具体的错误信息
		loggerUtil.Error("Failed to connect database", zap.Error(err))
		panic("failed to connect database")
	}
	// 自动迁移模型
	db.AutoMigrate(dbConn)

	// 使用 JWT 中间件
	r.Use(middlewares.JWTAuthMiddleware(cfg))
	r.Use(middlewares.LoggerMiddleware(loggerUtil))

	// 注册路由
	userHandler := handlers.NewUserHandler(dbConn)
	userGroup := r.Group("/users")
	{
		userGroup.POST("", userHandler.CreateUser)
		userGroup.GET("", userHandler.GetAllUsers)
		userGroup.GET("/:id", userHandler.GetUserByID)
		userGroup.PUT("/:id", userHandler.UpdateUser)
		userGroup.DELETE("/:id", userHandler.DeleteUser)
		// 添加 InitUsers 路由
		userGroup.GET("/initUsers", func(c *gin.Context) {
			userHandler.InitUsers()
			c.JSON(http.StatusOK, gin.H{"message": "随机测试数据已成功插入"})
		})
	}

	// 假设存在 login 接口
	// 使用 Any 方法注册支持所有 HTTP 方法的路由
	r.Any("/login", func(c *gin.Context) {
		// 验证用户凭证
		// 这里简单模拟用户验证成功
		userID := "123"
		token, err := middlewares.GenerateToken(cfg, userID)
		if err != nil {
			c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to generate token"})
			return
		}
		c.JSON(http.StatusOK, gin.H{"token": token})
	})

	// 假设这里使用了 LoggerMiddleware
	loggerUtil = logger.NewLoggerUtil()
	r.Use(middlewares.LoggerMiddleware(loggerUtil))

	// 假设这里使用了 router 包的 SetupRoutes 函数
	routers.SetupRoutes(r, loggerUtil)
	// 启动服务器
	if err := r.Run(fmt.Sprintf(":%d", cfg.Server.Port)); err != nil {
		loggerUtil.Error("Failed to start server", zap.Error(err))
	}
}
